<?php
class Files extends BZ_Controller
{
    public function __construct()
    {
        parent::__construct();
        header("Content-type: application/json; charset=utf-8");
        $this->load->library('AliOSS/Alioss', null, 'Alioss');
    }

    /**
     * 图片上传 - 单文件
     */
    public function upload_image()
    {
        $method = $this->input->method();
        if (strtolower($method) != 'post') {
            $this->ajaxJson(false, '违法请求');
        }
        if (count($_FILES) <= 0) {
            $this->ajaxJson(false, '亲，您上传的图片不存在，请稍后重试~');
        }
        foreach ($_FILES as $file) {
            if ($file['error'] != 0) {
                $this->ajaxJson(false, $this->error($file['error']));
            }
            $file_name = addslashes(trim($file['name']));
            $file_path = $file['tmp_name'];
            $file_size = $file['size'];

            if (!is_uploaded_file($file_path) && !file_exists($file_path)) {
                $this->ajaxJson(false, '啊哦，上传出错了，请稍后重试');
            }
            $hash = md5_file($file_path); // 获取文件Hash值
            if (empty($hash)) {
                $this->ajaxJson(false, '图片校验失败，请换张图试试');
            }
            list($code, $msg) = $this->check_file_for_image($file_path);// 校验文件是否为图片
            if ($code != 1) {
                $this->ajaxJson(false, '您的图片格式不正确，请重新选择！');
            }
            $res = $this->Alioss->upload_file($file_path, $hash, true); // 阿里云OSS上传文件
            if (isset($res['status']) && $res['status']) {
                $result = [
                    'file_name'     => $file_name,      // 源文件名称
                    'file_size'     => $file_size,      // 文件大小
                    'file_hash'     => $hash,           // 文件Hash（MD5）
                    'save_path'     => $res['msg']['save_path'], //数据库保存路径
                    'file_url'      => $res['msg']['url'] // 文件URL地址
                ];
                $this->ajaxJson(true, '', $result);
            } else {
                $this->ajaxJson($res);
            }
            break; // 单文件上传，只循环一次
        }
    }

    /**
     * 上传图片 - 多文件
     */
    public function upload_images()
    {
        $method = $this->input->method();
        if ($method != 'post') {
            $this->ajaxJson(false, '违法请求');
        }
        if (count($_FILES) <= 0) {
            $this->ajaxJson(false, '亲，您上传的图片不存在，请稍后重试~');
        }
        $ret = array(); // 返回的结果列表
        foreach ($_FILES as $file) {
            if ($file['error'] != 0) {
                $this->ajaxJson(false, $this->error($file['error']));
            }
            $file_name = addslashes(trim($file['name']));
            $file_path = $file['tmp_name'];
            $file_size = $file['size'];

            if (!is_uploaded_file($file_path) && !file_exists($file_path)) {
                $this->ajaxJson(false, '啊哦，上传出错了，请稍后重试');
            }
            $hash = md5_file($file_path); // 获取文件Hash值
            if (empty($hash)) {
                $this->ajaxJson(false, '图片校验失败，请联系管理员后重试');
            }
            // 文件不存在数据库
            list($code, $msg) = $this->check_file_for_image($file_path);// 校验文件是否为图片
            if ($code != 1) {
                $this->ajaxJson(false, '您的图片格式不正确，请重新选择！');
            }
            $res = $this->Alioss->upload_file($file_path, $hash, true); // 阿里云OSS上传文件
            if (isset($res['status']) && $res['status']) {
                $result = [
                    'file_name'     => $file_name,      // 源文件名称
                    'file_size'     => $file_size,      // 文件大小
                    'file_hash'     => $hash,           // 文件Hash（MD5）
                    'save_path'     => $res['msg']['save_path'], //数据库保存路径
                    'file_url'      => $res['msg']['url'] // 文件URL地址
                ];
                $ret[] = $result;
            } else {
                $ret[] = $res;
            }
        }
        // 返回处理结果
        if ($ret) {
            $this->ajaxJson(true, '', $ret);
        } else {
            $this->ajaxJson(false, '亲，您上传的图片不存在，请稍后重试~');
        }
    }

    /**
     * 校验文件是否为图片类型
     * @param string $file_path 文件路径
     * @return array
     */
    protected function check_file_for_image($file_path)
    {
        $image_mime = array(
            'image/bmp',
            'image/jpeg',
            'image/png',
            'image/gif'
        );

        $fp = finfo_open(FILEINFO_MIME_TYPE);
        if ($fp) {
            $file_mime = finfo_file($fp, $file_path);
            finfo_close($fp);
            if (in_array($file_mime, $image_mime)) {
                return [1, $file_mime];
            } else{
                return [2, '文件格式有误'];
            }
        }
        return [-1, '文件不存在'];
    }

    /**
     * 获取错误代码信息
     * @param string $errorNo 错误号码
     * @return string
     */
    protected function error($errorNo)
    {
        switch($errorNo) {
            case 1:
                $error = '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值';
                break;
            case 2:
                $error = '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值';
                break;
            case 3:
                $error = '文件只有部分被上传';
                break;
            case 4:
                $error = '没有文件被上传';
                break;
            case 6:
                $error = '找不到临时文件夹';
                break;
            case 7:
                $error = '文件写入失败';
                break;
            default:
                $error = '未知上传错误！';
        }
        return $error;
    }
}